package cn.tedu.suppermemory.service.impl;

import cn.tedu.suppermemory.ex.ServiceException;
import cn.tedu.suppermemory.mapper.PermissionMapper;
import cn.tedu.suppermemory.pojo.dto.PermissionAddNewDTO;
import cn.tedu.suppermemory.pojo.dto.PermissionUpdateDTO;
import cn.tedu.suppermemory.pojo.entity.Permission;
import cn.tedu.suppermemory.pojo.vo.PermissionListItemVO;
import cn.tedu.suppermemory.pojo.vo.PermissionStandardVO;
import cn.tedu.suppermemory.service.IPermissionService;
import cn.tedu.suppermemory.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Iterator;
import java.util.List;

@Slf4j
@Service
public class PermissionServiceImpl implements IPermissionService {

    @Autowired
    private PermissionMapper permissionMapper;

    public PermissionServiceImpl() {
        log.info("创建业务类对象：PermissionServiceImpl");
    }

    /**
     * 添加权限
     *
     * @param permissionAddNewDTO 管理员数据
     */
    @Override
    public void addNew(PermissionAddNewDTO permissionAddNewDTO) {
        log.debug("开始处理【添加权限】的业务，参数：{}", permissionAddNewDTO);
        // 检查权限名称是否已经被占用
        String name = permissionAddNewDTO.getName();
        int countByName = permissionMapper.countByName(name);
        if (countByName > 0) {
            // 如果已经被占用，抛出异常
            String message = "添加权限失败，权限名称已经被占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        // 检查权限表的value是否已经被占用
        String value = permissionAddNewDTO.getValue();
        int countByValue = permissionMapper.countByValue(value);
        if (countByValue > 0) {
            // 如果已经被占用，抛出异常
            String message = "添加权限失败，权限的value已经被占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        // 创建Album对象
        Permission permission = new Permission();
        // 补全permission对象中的属性值：来自参数permissionAddNewDTO
        BeanUtils.copyProperties(permissionAddNewDTO, permission);
        // 执行插入数据
        log.debug("即将插入数据，参数：{}", permission);
        int rows = permissionMapper.insert(permission);
        if (rows != 1) {
            String message = "添加权限失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT, message);
        }

    }

    /**
     * 删除权限
     *
     * @param id 权限id
     */
    @Override
    public void delete(Long id) {
        log.info("开始处理【根据id删除权限】的业务，参数：{}", id);
        //检查需要删除的元素是否存在
        PermissionStandardVO standardById = permissionMapper.getStandardById(id);
        if (standardById == null) {
            String message = "删除权限失败，尝试删除的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        // 执行删除
        log.info("即将执行删除数据，参数：id = {}", id);
        int rows = permissionMapper.deleteById(id);
        if (rows != 1) {
            String message = "删除权限数据失败，服务器忙，请稍后再试！";
            log.warn("message");
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
    }

    @Override
    public void updateInfoById(Long id, PermissionUpdateDTO permissionUpdateDTO) {
        log.debug("开始处理【修改权限数据】的业务，参数ID：{}，新数据：{}",id, permissionUpdateDTO);

        {
            // 调用Mapper的getStandardById()执行查询，检查数据是否不存在
            PermissionStandardVO permission = permissionMapper.getStandardById(id);
            // 是：数据不存在，抛出异常
            if (permission == null) {
                String message = "修改权限数据失败，尝试访问的数据不存在！";
                log.warn(message);
                throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
            }
        }

        // 检查权限名称是否已经被占用
        String name = permissionUpdateDTO.getName();
        int countByName = permissionMapper.countByName(name);
        if (countByName > 0) {
            // 如果已经被占用，抛出异常
            String message = "添加权限失败，权限名称已经被占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        // 检查权限表的value是否已经被占用
        String value = permissionUpdateDTO.getValue();
        int countByValue = permissionMapper.countByValue(value);
        if (countByValue > 0) {
            // 如果已经被占用，抛出异常
            String message = "添加权限失败，权限的value已经被占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }


        // 创建Permission对象
        Permission permission = new Permission();
        // 将参数对象的属性值复制到以上新创建的Album对象中
        BeanUtils.copyProperties(permissionUpdateDTO, permission);
        permission.setId(id);
        // 调用Mapper的update(Album album)方法执行修改
        log.debug("即将执行修改数据，参数：{}", permission);
        int rows = permissionMapper.update(permission);
        if (rows != 1) {
            String message = "修改相册详情失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    /**
     * 根据权限id查询权限数据
     *
     * @param id 权限的id
     * @return 匹配的权限详情，如果没有匹配的数据，将抛出异常
     */
    @Override
    public PermissionStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询权限数据的详情】的业务，参数：{}", id);

        // 调用Mapper的getStandardById()执行查询
        PermissionStandardVO permission = permissionMapper.getStandardById(id);
        // 判断查询结果是否为null
        // 是：没有匹配的数据，抛出异常（NOT_FOUND）
        if (permission == null) {
            String message = "查询权限详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        log.debug("即将返回查询结果：{}", permission);
        return permission;
    }

    /**
     * 查询权限列表数据
     *
     * @return  List<PermissionListItemVO> 权限列表
     */
    @Override
    public List<PermissionListItemVO> list() {
        log.info("开始处理【查询权限列表数据】的业务，参数：无");
        List<PermissionListItemVO> list = permissionMapper.list();

        Iterator<PermissionListItemVO> iterator = list.iterator();
        while (iterator.hasNext()) {
            PermissionListItemVO permission = iterator.next();
        }
        return list;
    }


}
